package com.terrytian.springboottq.annotation;

import com.terrytian.springboottq.convert.PreventConvert;
import com.terrytian.springboottq.handler.PreventHandler;

import java.lang.annotation.*;

/**
 *接口防刷注解
 *大致逻辑:
 *定义一个切面，通过@Prevent注解作为切入点、
 *在该切面的前置通知获取该方法的所有入参并自定义redis的部分key，* 将自定义redis的部分key的Base64编码+完整方法名作为redis的key，
 *自定义redis的部分ey作为reids的alue，@Prevent的vaLue作为redis的expire，存入redis;
 * <p>
 *使用:
 * 1.在相应需要防刷的方法上加上该注解，即可
 * 2.接口有入参，无参的需要自定义covert
 *
 * @author: tianqing
 * @date:2022/11/26
 */
@Documented
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Prevent {

    /**
     * 限制的时间值（秒）
     *
     * @return
     */
    String time() default "60";

    /**
     * 提示
     */
    String message() default "";

    /**
     * 是否支持用在空入参的方法上，自定义转换器后可以支持
     * @return
     */
    Class<? extends PreventConvert> nullAble() default PreventConvert.class;

    /**
     * 转换器:用于定义redis的key
     * @return
     */
    Class<? extends PreventConvert> convert() default PreventConvert.class;

    /**
     * 处理策略
     * @return
     */
    Class<? extends PreventHandler> strategy() default PreventHandler.class;
}
